package com.squirrels.server.entity;

import com.squirrels.server.common.constant.SystemConstant;
import com.squirrels.server.common.constant.UserConstant;
import com.squirrels.server.message.protobuf.Message;
import com.squirrels.server.service.UserService;
import io.netty.buffer.ByteBufUtil;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.socket.DatagramPacket;
import lombok.Data;

import java.net.InetSocketAddress;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 创建者: FlyingSquirrels
 * 创建时间: 2024/8/22 9:04
 * 描述:
 */
@Data
public class Room {
    // 房间用户
    private ConcurrentHashMap<String, RoomUser> userMap;
    // 房主/房间 id
    private String id;
    // 数据库操作服务
    private UserService userService;
    // 房间人数上线
    private int maxSize;

    public Room(String id,InetSocketAddress sender,UserService userService,String name){
        this.userService = userService;
        this.id = id;
        RoomUser user = new RoomUser(sender,Long.valueOf(id),name);
        userMap = new ConcurrentHashMap();
        userMap.put(id,user);
    }

    // 加入房间
    public boolean addRoom(String id,InetSocketAddress sender,String name){
        // 检查人数是否满员
        if (!isNotFull()){
            return false;
        }
        // 检查是否已经存在
        if(this.id.equals(id)){
            return true;
        }
        Set<Map.Entry<String, RoomUser>> entries = userMap.entrySet();
        for (var entity : entries){
            if(entity.getKey().equals(id)){
                return true;
            }
        }

        // 检查添加人员是否失败
        if (null == userMap.put(id, new RoomUser(sender,Long.valueOf(id),name))){
            return false;
        }
        return true;
    }

    // 退出房间
    public boolean exitUser(Message.Entity entity,ChannelHandlerContext ctx) {
        String uid = entity.getPlayer().getId();
        RoomUser roomUser = userMap.get(uid);
        if (null == roomUser){
            return false;
        }
        // 计算得分奖励
        long course = entity.getPlayer().getStart() * 10;
        // 退出房间结算奖励
        userService.addGlod(uid,course);
        userMap.remove(uid);
        return true;
    }

    /**
     * 同步数据
     * @param id 用户id
     * @param sender 发送地址信息
     * @param ctx 数据通道
     * @param entity 将要转发的同步信息
     * @return
     */
    public void update(String id,ChannelHandlerContext ctx, Message.Entity entity){
        // 对某些操作进行额外处理 被击杀得分
        operation(entity);
        RoomUser user;
        DatagramPacket datagramPacket;
        for (Map.Entry<String, RoomUser> entry : userMap.entrySet()) {
            user = entry.getValue();
            // 不给自己发送自己的消息 更新自己发送消息的最新时间
            if (user.getUid() == Long.valueOf(id)){
                user.setTimestamp(entity.getPlayer().getTime());
                continue;
            }
            // 封装数据包
            datagramPacket = new DatagramPacket(
                    ctx.alloc().buffer().writeBytes(entity.toByteArray()),
                    user.getSender()
            );
            // 写入缓冲区
            ctx.writeAndFlush(datagramPacket);
        }
    }

    // 对匹配的操作进行其他处理
    private void operation(Message.Entity entity){

    }

    // 检查是否满员
    public boolean isNotFull() {
        if (userMap.size() == maxSize){
            return false;
        }
        return true;
    }
}
